Loki

Loki

로그 저장/조회 시스템 — Prometheus와 동일한 레이블 모델로 로그를 인덱싱

개념

구성 요소 역할
Loki 로그 저장 및 조회 (메트릭처럼 라벨 기반 인덱싱, 내용은 비인덱싱)
Promtail 로그 수집 에이전트 (파일/도커 로그 tail → Loki push)
Grafana Loki 데이터소스 연결 → LogQL로 조회

Prometheus가 메트릭을 Pull하는 것과 달리, Promtail이 로그를 Push하는 구조


docker-compose

services:
  loki:
    image: grafana/loki:3.1.1
    container_name: loki
    command: ["-config.file=/etc/loki/config.yml"]
    volumes:
      - ./loki/config.yml:/etc/loki/config.yml:ro
      - ./loki/data:/loki
    ports: ["3100:3100"]
    networks: [monitoring_net]
    restart: unless-stopped

  promtail:
    image: grafana/promtail:3.1.1
    container_name: promtail
    command: ["-config.file=/etc/promtail/config.yml"]
    volumes:
      - ./promtail/config.yml:/etc/promtail/config.yml:ro
      - /var/lib/docker/containers:/var/lib/docker/containers:ro
      - /var/log:/var/log:ro
    networks: [monitoring_net]
    restart: unless-stopped

Loki 설정 (최소)

server:
  http_listen_port: 3100

common:
  path_prefix: /loki
  storage:
    filesystem:
      chunks_directory: /loki/chunks
      rules_directory: /loki/rules

schema_config:
  configs:
    - from: 2024-01-01
      store: tsdb
      object_store: filesystem
      schema: v13
      index:
        prefix: index_
        period: 24h

ruler:
  storage:
    type: local
    local:
      directory: /loki/rules
  rule_path: /loki/rules-temp
  alertmanager_url: http://alertmanager:9093

Promtail 설정 (도커 로그 수집)

server:
  http_listen_port: 9080

clients:
  - url: http://loki:3100/loki/api/v1/push

positions:
  filename: /tmp/positions.yaml

scrape_configs:
  - job_name: docker
    static_configs:
      - targets: [localhost]
        labels:
          job: docker
          __path__: /var/lib/docker/containers/*/*-json.log
    pipeline_stages:
      - docker: {}               # 도커 JSON 로그 파싱
      - labels:
          container: container_name
          image: image_name

  - job_name: syslog
    static_configs:
      - targets: [localhost]
        labels:
          job: syslog
          __path__: /var/log/*.log

Grafana 데이터소스 프로비저닝

# grafana/provisioning/datasources/loki.yml
apiVersion: 1
datasources:
  - name: Loki
    type: loki
    access: proxy
    url: http://loki:3100
    isDefault: false

LogQL 기본 쿼리

# 특정 컨테이너 로그
{job="docker", container="leafy_api"}

# ERROR 포함 로그만
{job="docker"} |= "ERROR"

# HTTP 5xx 카운트 (로그 기반)
sum by (container) (
  rate({job="docker"} |= " 5" |~ "HTTP/1.1\" 5[0-9]{2}" [5m])
)

관련 개념